// 斯特林反演
// 测试链接 ：https://www.luogu.com.cn/problem/P6620
// 相关帖子 ：https://www.cnblogs.com/dx123/p/17027971.html
// 相关帖子 ：https://oi-wiki.org/math/combinatorics/stirling/
// 提交以下的code，可以直接通过

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1006;
int n, x, P, m;
int a[MAXN], S[MAXN][MAXN];
int J[MAXN], pw[MAXN], pw1[MAXN];

int quickPow(int a, int b)
{
    int ans = 1;
    while(b)
    {
        if(b & 1) ans = 1LL * ans * a % P;
        a = 1LL * a * a % P;
        b >>= 1;
    }
    return ans;
}

void init()
{
    S[0][0] = 1; // 第二类斯特林数
    for(int i = 1; i <= m; ++i)
    {
        for(int j = 1; j <= i; ++j)
        {
            S[i][j] = (S[i - 1][j - 1] + 1LL * j * S[i - 1][j] % P) % P;
        }
    }
    J[0] = 1; // J[i] = n! / (n - i)!
    for(int i = 1; i <= m; ++i) J[i] = 1LL * J[i - 1] * (n - i + 1) % P;
    for(int i = 0; i <= m; ++i)
    {
        pw[i] = quickPow(x, i); // pw[i] = x^i
        pw1[i] = quickPow(x + 1, n - i); // pw1[i] = (x + 1)^(n - i)
    }
}

int main()
{
    scanf("%d%d%d%d", &n, &x, &P, &m);
    for(int i = 0; i <= m; ++i) scanf("%d", a + i);
    init();
    
    int ans = 0;
    for(int i = 0; i <= m; ++i)
    {
        int sum = 0;
        for(int j = 0; j <= i; ++j)
        {
            sum = (sum + 1LL * S[i][j] * J[j] % P * pw[j] % P * pw1[j]) % P;
        }
        ans = (ans + 1LL * a[i] * sum) % P;
    }
    printf("%d\n", ans);

    return 0;
}